
#include <iostream>
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
 
using namespace boost::asio;
using boost::system::error_code;
using namespace std;
 
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
 
//创建一个监听器,，绑定io_service和端点
io_service service;
ip::tcp::endpoint ep(ip::tcp::v4(), 2001); // listen on 2001
ip::tcp::acceptor acc(service, ep);
 
void StartAccept()
{
	//接受客户端连接,为了保证连接期间sock的有效性，lambda的[]中采用了值传递，不可用引用形式
	socket_ptr sock(new ip::tcp::socket(service));
	acc.async_accept(*sock, [sock](const boost::system::error_code &err) {
		if (err)
		{
			cout << err << endl;
			return;
		}
 
		//继续添加等待连接事件，防止io_service因为没有事件而退出
		StartAccept();
 
		//向客户端发送信息
		cout << "Client:";
		cout << sock->remote_endpoint().address() << endl;
 
		boost::shared_ptr<std::string> pstr(new std::string("boost asio!"));
		//捕捉pstr，保证异步发送期间数据的有效性
		sock->async_write_some(buffer(*pstr), [pstr](const boost::system::error_code &ec, std::size_t bytes) {
			if (ec)
				std::cout << "发送失败，错误码: " << ec <<std::endl;
			else
				std::cout << " 发送成功: " << bytes << "字节" <<std::endl;
		});
	});
}
 
int main()
{
	StartAccept();
	//循环分发异步回调事件，当所有事件分发完后退出
	service.run();
}